<?php
/**
 * securityの基底class.
 *
 * 基本はサニタイズ＆チェック.
 * @date 2009/10/15
 * @author nagai
 * @version $Id: lib_security_base.php 6 2009-11-24 06:08:50Z tzr250rsp $
 */
class lib_security_base {


  /**
   * HTML用(XSS対抗)サニタイズ.
   * @note
   * とりあえずhtmlsppuecialchars()使ってますが、問題あったら自作してください.
   * @param string $base_string
   * @return string
   */
  static public function sanitize_html($base_string)
  {
    if(true == is_object($base_string) and method_exists($base_string,'__toString')){
      $base_string = $base_string->__toString();
    }

    // XXX とりあえずhtmlsppuecialchars 使うけど問題あったら速攻自作!!
    // XXX htmlentitiesは適用範囲がもう一つ不明なので怖いから使わない
    // XXX シングルクォートもエスケープしておきたいので ENT_QUOTES を add
    //    return @htmlspecialchars($base_string, ENT_QUOTES);
    //return @htmlspecialchars($base_string);

    //FIXME シングルクオートどうする？
    //    $base_string = @htmlspecialchars($base_string);
    //    $bodytag = str_replace("'", "\'", $base_string);
    //    return $bodytag;

    $base_string = @htmlspecialchars($base_string, ENT_QUOTES);
    //emoji対策用
    preg_match_all('/(?<unicode>(&amp;)#x(?<code>[a-z0-9]{4});)/ie',$base_string,$match);
    foreach ($match['code'] as  &$code){
      $code = '&#x'.$code.';';
    }
    $base_string =  str_replace($match['unicode'], $match['code'] ,$base_string);


    return $base_string;
  }


  /**
   * 正規表現用のサニタイズ.
   * @param string $base_string
   * @return string
   */
  static public function sanitize_regex($base_string)
  {
    $ret = "";
    // XXX 数字のみの時にint扱いされないように
    $base_string = $base_string . "";

    $length = strlen($base_string);
    for($i = 0; $i < $length; $i ++) {
      $itr = $base_string[$i];
      switch($itr) {
        // 以下の文字は '\'でエスケープしておく
        case '#':
        case '/':
        case '?':
        case '*':
        case '+':
        case '^':
        case '$':
        case '.':
        case '[':
        case ']':
        case '|':
        case '(':
        case ')':
        case '{':
        case '}':
        case '-':
        case '\\':
          $ret .= '\\';
          break;

        default:
          break;
      }
      $ret .= $itr;
    }
    //
    return $ret;
  }


  /**
   * DB用のエスケープ.
   * @param string $base_string
   * @return string
   */
  static public function sanitize_db($base_string)
  {
    // XXX addslashes はバグってるので使わない!!
    // return addslashes($base_string);

    // 実装.
    $ret = "";
    // XXX 数字のみの時にint扱いされないように.
    $base_string = $base_string . "";
    $length = strlen($base_string);
    for($i = 0; $i < $length; $i ++) {
      $itr = $base_string[$i];
      switch($itr) {
        // 以下の文字は '\'でエスケープしておく
        case '\'':
        case ';':
        case '"':
        case '\\':
          $ret .= '\\';
          break;

        default:
          break;
      }
      $ret .= $itr;
    }

    //
    return $ret;
  }


  /**
   * security::sanitize_dbを実行した後に、前後にクオートを付けて返します.
   *
   * @param string $base_string
   * @param string $quote_string
   * @return string
   */
  static public function sanitize_db_add_quote($base_string, $quote_string = "'")
  {
    // まずサニタイズ
    $ret = security::sanitize_db($base_string);

    // クォートをつける.
    return $quote_string . $ret . $quote_string;
  }

}
// end of class



?>